/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package algoritmogeneticoCHC;

import java.util.*;
/**
 *
 * @author Andrea
 */
public class IndividuoCHC extends Individuo{
    
    public boolean eliminar;
    
    public IndividuoCHC(){
        super();
        eliminar = false;
    }
    
    //Método que inicializa un individuo sin su genoma
    public IndividuoCHC(int bEnt, int bDec, int longi, int nV, double pM, Random al){
        super(bEnt, bDec, longi, nV, pM, al);
        eliminar = false;
    }
    
    //Método que inicializa a un individuo a partir de un genoma
    public IndividuoCHC(int[] g){
        super(g);
        eliminar = false;
    }
    
    //Método que inicializa a un individuo copiándolo de otro individuo
    public IndividuoCHC(IndividuoCHC ind2){
        super((Individuo)ind2);
        eliminar = false;
    }
    
    public void HUX(IndividuoCHC ind2, double threshold){
        int Hamming = 0;
        boolean diferentes[] = new boolean[super.longitud];
        for(int i = 0; i<super.longitud; i++){
            if(super.genoma[i]!=ind2.genoma[i]){
                diferentes[i]=true;
                Hamming++;
            }
            else{
                diferentes[i]=false;
            }
        }
        if(Hamming/2<=threshold){
            eliminar = true;
            ind2.eliminar = true;
        }
        else{
            int Mutados = 0;
            while(Mutados<Hamming/2){
                int j = (int)Math.floor(alea.nextDouble()*super.longitud);
                if(diferentes[j]){
                    int bit1 = super.genoma[j];
                    int bit2 = ind2.genoma[j];
                    ind2.genoma[j]=bit1;
                    super.genoma[j]=bit2;
                    Mutados++;
                    diferentes[j]=false;
                }
            }
        }
    }
    
    public void FitnessCHC(int opcion){
        if(!eliminar){
            Fitness(opcion);
        }
    }
    
      //Método que compara dos individuos de acuerdo a su fitness.
    //Si el individuo al que le pertenece el método es mayor, regresa un valor >0
    //Si el individuo al que le pertenece el método es menor, regresa un valor <0
    //Si son iguales, regresa 0
    public double ComparaFitness(Individuo ind2){
        double resul;
        resul = fitness-ind2.fitness;
        return resul;
    }
    
    public void MutaCataclismo(){
        for(int i = 0; i < super.longitud; i++){
            double a = alea.nextDouble();
            if (a<=super.probMuta){
                if(super.genoma[i]==0){
                    super.genoma[i]=1;
                }
                else{
                    super.genoma[i]=0;
                }
            } 
        }
    }
}
